CHeader Class

A header control is a window that is usually positioned above columns of text or numbers. It contains a title for each column, and it can be divided into parts. The user can drag the dividers that separate the parts to set the width of each column.

See: https://learn.microsoft.com/en-us/windows/win32/controls/header-controls

Include file: CHeader.inc

Name Description
ClearAllFilters Clears all of the filters for a given header control.
ClearFilter Clears the filter for a given header control.
CreateDragImage Creates a transparent version of an item image within an existing header control.
DeleteItem Deletes an item from a header control.
EditFilter Moves the input focus to the edit box when a filter button has the focus.
GetBitmapMargin Gets the width of the margin (in pixels) of a bitmap in an existing header control.
GetFocusedItem Gets the item in a header control that has the focus.
GetImageList Gets the handle to the image list that has been set for an existing header control.
GetItem Gets information about an item in a header control.
GetItemCount Gets a count of the items in a header control.
GetItemDropDownRect Gets the coordinates of the drop-down button for a specfied item in a header control. The header control must be of type HDF_SPLITBUTTON.
GetItemRect Gets the bounding rectangle for a given item in a header control.
GetItemOrder Gets the order of the specified item of a header control.
GetItemText Gets the text of the specified column.
GetItemWidth Gets the width of the specified item of a header control.
GetOrderArray Gets the current left-to-right order of items in a header control.
GetOverflowRect Gets the coordinates of the drop-down overflow area for a specified header control. The header control must be of type HDF_SPLITBUTTON.
GetStateImageList Gets the handle to the image list that has been set for an existing header control state.
GetText Gets the text of the specified column.
HitTest Tests a point to determine which header item, if any, is at the specified point.
InsertItem Inserts a new item into a header control.
Layout Retrieves the correct size and position of a header control within the parent window.
OrderToIndex Retrieves an index value for an item based on its order in the header control.
SetBitmapMargin Sets the width of the margin for a bitmap in an existing header control.
SetFilterChangeTimeout Sets the timeout interval between the time a change takes place in the filter attributes and the posting of an HDN_FILTERCHANGE notification.
SetFocusedItem Sets the focus to a specified item in a header control.
SetHotDivider Changes the color of a divider between header items to indicate the destination of an external drag-and-drop operation.
SetImageList Assigns an image list to an existing header control.
SetItem Sets the attributes of the specified item in a header control.
SetItemOrder Sets the order of the specified item of a header control.
SetItemText Sets the text of the specified item.
SetText Sets the text of the specified item.
SetItemWidth Sets the width of the specified item of a header control.
SetOrderArray Sets the left-to-right order of header items.
SetStateImageList Assigns an image list to an existing header control.
SetDarkMode Set header dark mode.
RemoveDarkMode Remove header dark mode.

ClearAllFilters

Clears all of the filters for a given header control.

FUNCTION ClearAllFilters (BYVAL hHeader AS HWND) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.

Return value

Returns TRUE or FALSE.


ClearFilter

Clears the filter for a given header control.

FUNCTION ClearFilter (BYVAL hHeader AS HWND, BYVAL i AS LONG) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
i A column value indicating which filter to clear.

Return value

Returns TRUE if successful, or FALSE otherwise.

Remarks

If the column value is specified as -1, all the filters are cleared, and the HDN_FILTERCHANGE notification is sent only once.


CreateDragImage

Creates a semi-transparent version of an item’s image for use as a dragging image.

FUNCTION CreateDragImage (BYVAL hHeader AS HWND, BYVAL i AS LONG) AS HIMAGELIST
Parameter Description
hHeader The handle of the header control.
i The zero-based index of the item within the header control. The image assigned to this item is the basis for the transparent image.

Return value

Returns a handle to an image list that contains the new image as its only element.


DeleteItem

Deletes an item from a header control.

FUNCTION DeleteItem (BYVAL hHeader AS HWND, BYVAL i AS LONG) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
i The zero-based index of the item to delete.

Return value

Returns TRUE if successful, or FALSE otherwise.


EditFilter

Moves the input focus to the edit box when a filter button has the focus.

FUNCTION EditFilter (BYVAL hHeader AS HWND, BYVAL i AS LONG, BYVAL fDiscardChanges AS BOOLEAN) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
i A value specifying the column to edit.
fDiscardChanges A flag that specifies how to handle the user’s editing changes. Use this flag to specify what to do if the user is in the process of editing the filter when the message is sent.
TRUE: Discard the changes made by the user.;
FALSE: Accept the changes made by the user.

Return value

Returns TRUE if successful, or FALSE otherwise.


GetBitmapMargin

Gets the width of the margin (in pixels) of a bitmap in an existing header control.

FUNCTION GetBitmapMargin (BYVAL hHeader AS HWND) AS LONG
Parameter Description
hHeader The handle of the header control.

Return value

Returns the width of the bitmap margin in pixels. If the bitmap margin was not previously specified, the default value of 3*GetSystemMetrics (CX_EDGE) is returned.


GetFocusedItem

Gets the item in a header control that has the focus.

FUNCTION GetBitmapMargin (BYVAL hHeader AS HWND) AS LONG
Parameter Description
hHeader The handle of the header control.

Return value

Returns the index of the item in focus.


GetImageList

Gets the handle to the image list that has been set for an existing header control.

FUNCTION GetImageList (BYVAL hHeader AS HWND) AS HIMAGELIST
Parameter Description
hHeader The handle of the header control.

Return value

Returns the handle to the image list that is set for the header control.


GetItem

Gets information about an item in a header control.

FUNCTION GetItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYVAL phdi AS HDITEMW PTR) AS BOOLEAN
FUNCTION GetItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYREF hdi AS HDITEMW) AS BOOLEAN
FUNCTION GetItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD) AS HDITEMW
Parameter Description
hHeader The handle of the header control.
i The index of the item for which information is to be retrieved.
phdi A pointer to an HDITEM structure. When the message is sent, the mask member indicates the type of information being requested. When the message returns, the other members receive the requested information. If the mask member specifies zero, the message returns TRUE but copies no information to the structure.

Return value

Returns TRUE if successful, or FALSE otherwise.

Remarks

If the HDI_TEXT flag is set in the mask member of the HDITEM structure, the control may change the pszText member of the structure to point to the new text instead of filling the buffer with the requested text. Applications should not assume that the text will always be placed in the requested buffer.


GetItemCount

Gets a count of the items in a header control.

FUNCTION GetItemCount (BYVAL hHeader AS HWND) AS LONG
Parameter Description
hHeader The handle of the header control.

Return value

Returns TRUE if successful, or FALSE otherwise.


GetItemDropDownRect

Gets the coordinates of the drop-down button for a specified item in a header control. The header control must be of type HDF_SPLITBUTTON.

FUNCTION GetItemDropDownRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYVAL prc AS RECT PTR) AS BOOLEAN
FUNCTION GetItemDropDownRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYREF rc AS RECT) AS BOOLEAN
FUNCTION GetItemDropDownRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS RECT
Parameter Description
hHeader The handle of the header control.
iItem The zero-based index of the header control item for which to retrieve the bounding rectangle.
prc A pointer to a RECT structure to receive the bounding rectangle information. The message sender is responsible for allocating this structure. The coordinates returned in the RECT structure are expressed as screen coordinates.

Return value

Returns TRUE if successful, or FALSE otherwise.


GetItemRect

Gets the bounding rectangle for a given item in a header control.

FUNCTION GetItemRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYVAL prc AS RECT PTR) AS BOOLEAN
FUNCTION GetItemRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYREF rc AS RECT) AS BOOLEAN
FUNCTION GetItemRect (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS RECT
Parameter Description
hHeader The handle of the header control.
iItem The zero-based index of the header control item for which to retrieve the bounding rectangle.
prc A pointer to a RECT structure that receives the bounding rectangle information.

Return value

Returns TRUE if successful, or FALSE otherwise.


GetItemOrder

Gets the order of the specified item of a header control.

FUNCTION GetItemOrder (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
iItem The zero-based index of the header control item for which to retrieve the order.

Return value

The order of the item.


GetItemText

Gets the text of the specified column.

FUNCTION GetItemText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, _
   BYVAL pwszText AS WSTRING PTR, BYVAL cchTextMax AS LONG = MAX_PATH + 1) AS BOOLEAN
FUNCTION GetItemText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS DWSTRING
FUNCTION GetText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, _
   BYVAL pwszText AS WSTRING PTR, BYVAL cchTextMax AS LONG = MAX_PATH + 1) AS BOOLEAN
FUNCTION GetText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS DWSTRING
Parameter Description
hHeader The handle of the header control.
iItem The zero-based index of the header control item for which to retrieve the text.
pwszText A pointer to an item string. If the text is being retrieved from the control, this member must be initialized to point to a character buffer. If this member is set to LPSTR_TEXTCALLBACK, the control will request text information for this item by sending an HDN_GETDISPINFO notification code. Note that although the header control allows a string of any length to be stored as item text, only the first 260 characters are displayed.
cchTextMax Maximum number of characters to return. Both this value and the size of the buffer pointed by pwszText must be one character bigger that the wanted length of the text to return to make room for the null character terminator.

Return value

Returns TRUE if successful, or FALSE otherwise.

The second overlodes method returns the retrieved text.


GetItemWidth

Gets the width of the specified item of a header control.

FUNCTION GetItemWidth (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
iItem The zero-based index of the header control item for which to retrieve the width.

Return value

The width of the item.


GetOrderArray

Gets the current left-to-right order of items in a header control.

FUNCTION GetOrderArray (BYVAL hHeader AS HWND, BYVAL iCount AS LONG, BYVAL lpiArray AS LONG PTR) AS LONG
Parameter Description
hHeader The handle of the header control.
iCount The number of integer elements that lpiArray can hold. This value must be equal to the number of items in the control (see GetItemCount).
lpiArray A pointer to an array of integers that receive the index values for items in the header.

Return value

Returns nonzero if successful, and the buffer at lpiArray receives the item number of each item in the header control in the order in which they appear from left to right. Returns zero otherwise.

Remarks

The number of elements in lpiArray is specified in iCount and must be equal to the number of items in the control. For example, the following code fragment will reserve enough memory to hold the index values.


GetOverflowRect

Gets the coordinates of the drop-down overflow area for a specified header control. The header control must be of type HDF_SPLITBUTTON.

FUNCTION GetOverflowRect (BYVAL hHeader AS HWND, BYVAL prc AS RECT PTR) AS BOOLEAN
FUNCTION GetOverflowRect (BYVAL hHeader AS HWND, BYREF rc AS RECT) AS BOOLEAN
FUNCTION GetOverflowRect (BYVAL hHeader AS HWND) AS RECT
Parameter Description
hHeader The handle of the header control.
prc A pointer to a RECT structure to receive the bounding rectangle information.The message sender is responsible for allocating this structure. The coordinates returned in the RECT structure are expressed as screen coordinates.

Return value

Returns TRUE if successful, or FALSE otherwise.


GetStateImageList

Gets the handle to the image list that has been set for an existing header control state.

FUNCTION GetStateImageList (BYVAL hHeader AS HWND) AS HIMAGELIST
Parameter Description
hHeader The handle of the header control.

Return value

Returns the handle to the image list that is set for the header control state.


HitTest

Tests a point to determine which header item, if any, is at the specified point.

FUNCTION HitTest (BYVAL hHeader AS HWND, BYVAL phdhti AS HDHITTESTINFO PTR) AS LONG
FUNCTION HitTest (BYVAL hHeader AS HWND, BYREF hdhti AS HDHITTESTINFO) AS LONG
FUNCTION HitTest (BYVAL hHeader AS HWND) AS HDHITTESTINFO
Parameter Description
hHeader The handle of the header control.
phdhti A pointer to an HDHITTESTINFO structure that contains the position to test and receives information about the results of the test.

Return value

Returns the index of the item at the specified position, if any, or -1 otherwise.


InsertItem

Inserts a new item into a header control.

FUNCTION InsertItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYVAL phdi AS HDITEM PTR) AS LONG
FUNCTION InsertItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYREF hdi AS HDITEM) AS LONG
Parameter Description
hHeader The handle of the header control.
i The index of the item after which the new item is to be inserted. The new item is inserted at the end of the header control if i is greater than or equal to the number of items in the control. If i is zero, the new item is inserted at the beginning of the header control.
phdi A pointer to an **HDITEM++ structure that contains information about the new item.

Return value

Returns the index of the new item if successful, or -1 otherwise.


Layout

Retrieves the correct size and position of a header control within the parent window.

FUNCTION Layout (BYVAL hHeader AS HWND, BYVAL phdl AS HDLAYOUT PTR) AS BOOLEAN
FUNCTION Layout (BYVAL hHeader AS HWND, BYREF hdl AS HDLAYOUT) AS BOOLEAN
FUNCTION Layout (BYVAL hHeader AS HWND) AS HDLAYOUT
Parameter Description
hHeader The handle of the header control.
phdi A pointer to an HDLAYOUT structure. The prc member specifies the coordinates of a rectangle, and the pwpos member receives the size and position for the header control within the rectangle.

Return value

Returns TRUE if successful, or FALSE otherwise.


OrderToIndex

Retrieves an index value for an item based on its order in the header control.

FUNCTION OrderToIndex (BYVAL hHeader AS HWND, BYVAL i AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
i The order that the item appears within the header control, from left to right. The index value of the item in the far left column would be 0, the next item to the right would be 1, and so on.

Return value

Returns an int that specifies the index of the item. If i is invalid (negative or too large), the return equals i.


SetBitmapMargin

Sets the width of the margin for a bitmap in an existing header control.

FUNCTION SetBitmapMargin (BYVAL hHeader AS HWND, BYVAL iWidth AS DWORD) AS LONG
Parameter Description
hHeader The handle of the header control.
iWidth The width, specified in pixels, of the margin that surrounds a bitmap within an existing header control.

Return value

Returns width of the bitmap margin in pixels. If the bitmap margin was not previously specified, the default value of 3*GetSystemMetrics (CX_EDGE) is returned.


SetFilterChangeTimeout

Sets the timeout interval between the time a change takes place in the filter attributes and the posting of an HDN_FILTERCHANGE notification.

FUNCTION SetFilterChangeTimeout (BYVAL hHeader AS HWND, BYVAL i AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
i The timeout value, in milliseconds.

Return value

Returns the index of the filter control being modified.


SetFocusedItem

Sets the focus to a specified item in a header control.

FUNCTION SetFocusedItem (BYVAL hHeader AS HWND, BYVAL iItem AS LONG) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
iItem The index of item.

Return value

Returns TRUE if successful, or FALSE otherwise.


SetHotDivider

Changes the color of a divider between header items to indicate the destination of an external drag-and-drop operation.

FUNCTION SetHotDivider (BYVAL hHeader AS HWND, BYVAL fPos AS BOOLEAN, BYVAL dwInputValue AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
fPos A value specifying how dw is to be interpreted. The value in this field can be one of the following:
TRUE: Indicates that dw holds client coordinates of the pointer.
FALSE: Indicates that dw holds a divider index value.
dwInputValue The value held here is interpreted depending on the value of fPos. If fPos is TRUE, dw represents the x- and y- client coordinates of the pointer. The x-coordinate is in the low word, and the y-coordinate is in the high word. Upon receiving the message, the header control highlights the appropriate divider based on the dw coordinates. If fPos is FALSE, dwInputValue represents the integer index of the divider that will be highlighted.
Return value

Returns the index of the divider that the control highlighted.

Remarks

A header control set to the HDS_DRAGDROP style produces this effect automatically. This message is intended to be used when the owner of the control handles drag-and-drop operations manually.


SetImageList

Assigns an image list to an existing header control.

FUNCTION SetImageList (BYVAL hHeader AS HWND, BYVAL himl AS HIMAGELIST) AS HIMAGELIST
Parameter Description
hHeader The handle of the header control.
himl A handle to an image list.

Return value

Returns the handle to the image list previously assigned to the header control, or NULL if there is no previous image list.


SetItem

Sets the attributes of the specified item in a header control.

FUNCTION SetItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYVAL phdi AS HDITEMW PTR) AS LONG
FUNCTION SetItem (BYVAL hHeader AS HWND, BYVAL i AS DWORD, BYREF hdi AS HDITEMW) AS LONG
Parameter Description
hHeader The handle of the header control.
i The index of the item whose attributes are to be changed.
phdi A pointer to an HDITEM structure that contains item information. When this message is sent, the mask member of the structure must be set to indicate which attributes are being set

Return value

Returns nonzero upon success, or zero otherwise.


SetItemOrder

Sets the order of the specified item of a header control.

FUNCTION SetItemOrder (BYVAL hHeader AS HWND, BYVAL nItem AS LONG, BYVAL iOrder AS LONG) AS LONG
Parameter Description
hHeader The handle of the header control.
iItem The index of the item whose attributes are to be changed.
iOrder The order in which the item appears within the header control, from left to right. That is, the value for the far left item is 0. The value for the next item to the right is 1, and so on.

Return value

Returns TRUE upon success, or FALSE otherwise.


SetItemText

Sets the text of the specified item.

FUNCTION SetItemText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYVAL pwszText AS WSTRING PTR) AS BOOLEAN
FUNCTION SetText (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYVAL pwszText AS WSTRING PTR) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
iItem The index of the item whose text will be changed.
pwszText The text to set.

Return value

Returns TRUE if successful, or FALSE otherwise.


SetItemWidth

Sets the width of the specified item of a header control.

FUNCTION SetItemWidth (BYVAL hHeader AS HWND, BYVAL iItem AS LONG, BYVAL nWidth AS LONG) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
iItem The index of the item whose width will be changed.
nWidth The new width of the item.

Return value

Returns TRUE if successful, or FALSE otherwise.


SetOrderArray

Sets the left-to-right order of header items.

FUNCTION SetOrderArray (BYVAL hHeader AS HWND, BYVAL iCount AS LONG, BYVAL lpiArray AS LONG PTR) AS BOOLEAN
Parameter Description
hHeader The handle of the header control.
iCount The size of the buffer at lpiArray, in elements. This value must equal the value returned by GetItemCount.
lpiArray A pointer to an array that specifies the order in which items should be displayed, from left to right. For example, if the contents of the array are {2,0,1}, the control displays item 2, item 0, and item 1, from left to right.

Return value

Returns TRUE if successful, or FALSE otherwise.


SetStateImageList

Assigns an image list to an existing header control state.

FUNCTION SetStateImageList (BYVAL hHeader AS HWND, BYVAL himl AS HIMAGELIST) AS HIMAGELIST
Parameter Description
hHeader The handle of the header control.
himl A handle to an image list control.

Return value

Returns the handle to the image list previously assigned to the header control state, or NULL if there is no previous image list.


SetDarkMode

Sets the header dark mode.

FUNCTION SetDarkMode (BYVAL hHeader AS HWND) AS HRESULT
Parameter Description
hHeader The handle of the header control.

Return value

If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.


RemoveDarkMode

Removes the header dark mode.

FUNCTION RemoveDarkMode (BYVAL hHeader AS HWND) AS HRESULT
Parameter Description
hHeader The handle of the header control.

Return value

If this function succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.


Example

#define UNICODE
#define _WIN32_WINNT &h0602
#INCLUDE ONCE "AfxNova/CWindow.inc"
#INCLUDE ONCE "AfxNova/CHeader.inc"
USING AfxNova

DECLARE FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _
                           BYVAL hPrevInstance AS HINSTANCE, _
                           BYVAL pwszCmdLine AS WSTRING PTR, _
                           BYVAL nCmdShow AS LONG) AS LONG
   END wWinMain(GetModuleHandleW(NULL), NULL, wCommand(), SW_NORMAL)

' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

CONST IDC_HEADER = 1001

' ========================================================================================
' Main
' ========================================================================================
FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _
                   BYVAL hPrevInstance AS HINSTANCE, _
                   BYVAL pwszCmdLine AS WSTRING PTR, _
                   BYVAL nCmdShow AS LONG) AS LONG

   ' // Set process DPI aware
   SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)
   ' // Enable visual styles without including a manifest file
   AfxEnableVisualStyles

   ' // Creates the main window
   DIM pWindow AS CWindow = "MyClassName"   ' Use the name you wish
   DIM hWin AS HWND = pWindow.Create(NULL, "CWindow - Header control", @WndProc)
   ' // Sizes it by setting the wanted width and height of its client area
   pWindow.SetClientSize(400, 220)
   ' // Centers the window
   pWindow.Center

   ' // Add the header control.
   DIM hHeader AS HWND = pWindow.AddControl("Header", hWin, IDC_HEADER)
   ' // Insert items
   DIM thdi AS HDITEMW
   DIM wszItem AS WSTRING * 260
   wszItem   = "Item 1"
   thdi.Mask = HDI_WIDTH OR HDI_FORMAT OR HDI_TEXT
   thdi.fmt  = HDF_LEFT OR HDF_STRING
   thdi.cxy  = pWindow.ScaleX(80)
   thdi.pszText  = @wszItem
   thdi.cchTextMax = LEN(wszItem)
   CHeader.InsertItem(hHeader, 1, @thdi)
   wszItem   = "Item 2"
   CHeader.InsertItem(hHeader, 2, @thdi)
   wszItem   = "Item 3"
   CHeader.InsertItem(hHeader, 3, @thdi)
   wszItem   = "Item 4"
   CHeader.InsertItem(hHeader, 4, @thdi)
   wszItem   = "Item 5"
   CHeader.InsertItem(hHeader, 5, @thdi)

   ' // Adds a button
   DIM hButton AS HWND = pWindow.AddControl("Button", hWin, IDCANCEL, "&Close", 270, 155, 75, 30)
   ' // Anchors the button to the bottom and the right side of the main window
   pWindow.AnchorControl(hButton, AFX_ANCHOR_BOTTOM_RIGHT)

   ' // Displays the window and dispatches the Windows messages
   FUNCTION = pWindow.DoEvents(nCmdShow)

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

   SELECT CASE uMsg

      ' // If an application processes this message, it should return zero to continue
      ' // creation of the window. If the application returns –1, the window is destroyed
      ' // and the CreateWindowExW function returns a NULL handle.
      CASE WM_CREATE
         AfxEnableDarkModeForWindow(hwnd)
         RETURN 0

      ' // Theme has changed
      CASE WM_THEMECHANGED
         AfxEnableDarkModeForWindow(hwnd)
         RETURN 0

      ' // Sent when the user selects a command item from a menu, when a control sends a
      ' // notification message to its parent window, or when an accelerator keystroke is translated.
      CASE WM_COMMAND
         SELECT CASE CBCTL(wParam, lParam)
            CASE IDCANCEL
               ' // If ESC key pressed, close the application by sending an WM_CLOSE message
               IF CBCTLMSG(wParam, lParam) = BN_CLICKED THEN SendMessageW(hwnd, WM_CLOSE, 0, 0)
         END SELECT
         RETURN 0

      CASE WM_NOTIFY
         ' // Retrieve the header item clicked
         DIM hd AS NMHEADERW
         CBNMTYPESET(hd, wParam, lParam)
         IF hd.hdr.idFrom = IDC_HEADER THEN
            SELECT CASE hd.hdr.code
               CASE HDN_ITEMCLICKW
                  MessageBox hwnd, "You have clicked item " & WSTR(hd.iItem + 1), "Message", MB_OK
            END SELECT
         END IF

      CASE WM_SIZE
         ' // Resize the header control
         DIM hHeader AS HWND = GetDLgItem(hwnd, IDC_HEADER)
         DIM thdl AS HDLAYOUT, twp AS WINDOWPOS, trc AS RECT
         GetClientRect hwnd, @trc
         thdl.prc = @trc
         thdl.pwpos = @twp
         CHeader.Layout(hHeader, @thdl)
         SetWindowPos hHeader, NULL, twp.x, twp.y, twp.cx, twp.cy, SWP_NOZORDER OR SWP_NOACTIVATE
         RETURN 0

      CASE WM_DESTROY
         ' // End the application by sending an WM_QUIT message
         PostQuitMessage(0)
         RETURN 0

   END SELECT

   ' // Default processing of Windows messages
   FUNCTION = DefWindowProcW(hwnd, uMsg, wParam, lParam)

END FUNCTION
' ========================================================================================

Example: Dark mode

#define UNICODE
#define _WIN32_WINNT &h0602
#INCLUDE ONCE "AfxNova/CWindow.inc"
#INCLUDE ONCE "AfxNova/CHeader.inc"
USING AfxNova

DECLARE FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _
                           BYVAL hPrevInstance AS HINSTANCE, _
                           BYVAL pwszCmdLine AS WSTRING PTR, _
                           BYVAL nCmdShow AS LONG) AS LONG
   END wWinMain(GetModuleHandleW(NULL), NULL, wCommand(), SW_NORMAL)

' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

CONST IDC_HEADER = 1001

' ========================================================================================
' Main
' ========================================================================================
FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _
                   BYVAL hPrevInstance AS HINSTANCE, _
                   BYVAL pwszCmdLine AS WSTRING PTR, _
                   BYVAL nCmdShow AS LONG) AS LONG

   ' // Set process DPI aware
   SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)
   ' // Enable visual styles without including a manifest file
   AfxEnableVisualStyles

   ' // Creates the main window
   DIM pWindow AS CWindow = "MyClassName"   ' Use the name you wish
   DIM hWin AS HWND = pWindow.Create(NULL, "CWindow - Header control", @WndProc)
   ' // Sizes it by setting the wanted width and height of its client area
   pWindow.SetClientSize(400, 220)
   ' // Centers the window
   pWindow.Center
   ' // Set the back color of the window
   pWindow.SetBackColor(RGB_BLACK)

   ' // Add the header control.
   DIM hHeader AS HWND = pWindow.AddControl("Header", hWin, IDC_HEADER)
   ' // Use dark mode theme
   SetWindowTheme(hHeader, "DarkMode_ItemsView", NULL)

   ' // Insert items
   DIM thdi AS HDITEMW
   DIM wszItem AS WSTRING * 260
   wszItem   = "Item 1"
   thdi.Mask = HDI_WIDTH OR HDI_FORMAT OR HDI_TEXT
   thdi.fmt  = HDF_LEFT OR HDF_STRING
   thdi.cxy  = pWindow.ScaleX(80)
   thdi.pszText  = @wszItem
   CHeader.InsertItem(hHeader, 1, @thdi)
   wszItem   = "Item 2"
   CHeader.InsertItem(hHeader, 2, @thdi)
   wszItem   = "Item 3"
   CHeader.InsertItem(hHeader, 3, @thdi)
   wszItem   = "Item 4"
   CHeader.InsertItem(hHeader, 4, @thdi)
   wszItem   = "Item 5"
   CHeader.InsertItem(hHeader, 5, @thdi)

   ' // Adds a button
   DIM hButton AS HWND = pWindow.AddControl("Button", hWin, IDCANCEL, "&Close", 270, 155, 75, 30)
   ' // Set button dark mode
   SetWindowTheme(hButton, "DarkMode_Explorer", NULL)
   ' // Anchors the button to the bottom and the right side of the main window
   pWindow.AnchorControl(IDCANCEL, AFX_ANCHOR_BOTTOM_RIGHT)

   ' // Displays the window and dispatches the Windows messages
   FUNCTION = pWindow.DoEvents(nCmdShow)

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

   SELECT CASE uMsg

      ' // If an application processes this message, it should return zero to continue
      ' // creation of the window. If the application returns –1, the window is destroyed
      ' // and the CreateWindowExW function returns a NULL handle.
      CASE WM_CREATE
         AfxEnableDarkModeForWindow(hwnd)
         RETURN 0

      ' // Theme has changed
      CASE WM_THEMECHANGED
         AfxEnableDarkModeForWindow(hwnd)
         RETURN 0

      ' // Sent when the user selects a command item from a menu, when a control sends a
      ' // notification message to its parent window, or when an accelerator keystroke is translated.
      CASE WM_COMMAND
         SELECT CASE CBCTL(wParam, lParam)
            CASE IDCANCEL
               ' // If ESC key pressed, close the application by sending an WM_CLOSE message
               IF CBCTLMSG(wParam, lParam) = BN_CLICKED THEN SendMessageW(hwnd, WM_CLOSE, 0, 0)
         END SELECT
         RETURN 0

      CASE WM_NOTIFY
         ' // Retrieve the header item clicked
         DIM hd AS NMHEADERW
         CBNMTYPESET(hd, wParam, lParam)
         IF hd.hdr.idFrom = IDC_HEADER THEN
            SELECT CASE hd.hdr.code
               CASE HDN_ITEMCLICKW
                  MessageBox hwnd, "You have clicked item " & WSTR(hd.iItem + 1), "Message", MB_OK
            END SELECT
         END IF

         ' // Change the colors of the header control
         DIM nmh AS NMHDR
         CBNMTYPESET(nmh, wParam, lParam)
         IF nmh.idFrom = IDC_HEADER THEN
            IF nmh.code = NM_CUSTOMDRAW THEN
               DIM nmcd AS NMCUSTOMDRAW
               CBNMTYPESET(nmcd, wParam, lParam)
               ' // Check the drawing stage
               SELECT CASE nmcd.dwDrawStage
                  ' // Prior to painting
                  CASE CDDS_PREPAINT
                     ' // Tell Windows we want individual notification of each item being drawn
                     RETURN CDRF_NOTIFYITEMDRAW
                     ' // Notification of each item being drawn
                  CASE CDDS_ITEMPREPAINT
                     ' // Set text color of the header
                     SetTextColor(nmcd.hdc, RGB_WHITE)
                     SetBkMode(nmcd.hdc, TRANSPARENT)
                     RETURN CDRF_DODEFAULT
               END SELECT
            END IF
         END IF

      CASE WM_SIZE
         ' // Resize the header control
         DIM hHeader AS HWND = GetDLgItem(hwnd, IDC_HEADER)
         DIM thdl AS HDLAYOUT, twp AS WINDOWPOS, trc AS RECT
         GetClientRect hwnd, @trc
         thdl.prc = @trc
         thdl.pwpos = @twp
         CHeader.Layout(hHeader, @thdl)
         SetWindowPos hHeader, NULL, twp.x, twp.y, twp.cx, twp.cy, SWP_NOZORDER OR SWP_NOACTIVATE
         RETURN 0

      CASE WM_DESTROY
         ' // End the application by sending an WM_QUIT message
         PostQuitMessage(0)
         RETURN 0

   END SELECT

   ' // Default processing of Windows messages
   FUNCTION = DefWindowProcW(hwnd, uMsg, wParam, lParam)

END FUNCTION
' ========================================================================================